package com.sky.module.system.permission.service.impl;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sky.module.system.permission.dao.PermissionMapper;
import com.sky.module.system.permission.domain.entity.Permission;
import com.sky.module.system.permission.domain.vo.PermissionQueryVo;
import com.sky.module.system.permission.domain.vo.RolePermissionVo;
import com.sky.module.system.permission.service.PermissionService;
import com.sky.module.system.user.dao.UserMapper;
import com.sky.module.system.user.domain.entity.User;
import com.sky.module.system.utils.MenuTree;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;

import javax.annotation.Resource;
import java.util.*;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author zsg
 * @since 2023-02-20
 */
@Transactional
@Service
public class PermissionServiceImpl extends ServiceImpl<PermissionMapper, Permission> implements PermissionService {

    @Resource
    private PermissionMapper permissionMapper;


    @Autowired
    private UserMapper userMapper;

    @Override
    public List<Permission> findPermissionListByUserId(Long userId) {
        return permissionMapper.findPermissionListByUserId(userId);
    }

    /***
     * @description 查询菜单列表方法
     * @param permissionQueryVo
     * @return java.util.List<com.zsg.entity.Permission>
     * @date 2023/2/22 12:29
     *
     */
    @Override
    public List<Permission> findPermissionList(PermissionQueryVo permissionQueryVo) {
        // 创建条件构造器对象
        LambdaQueryWrapper<Permission> queryWrapper = new LambdaQueryWrapper<>();
//        queryWrapper.eq().
        queryWrapper.orderByAsc(Permission::getOrderNum);
//        调用查询菜单列表的方法
        final List<Permission> permissionList = baseMapper.selectList(queryWrapper);
//        生成菜单树
        final List<Permission> menuTree = MenuTree.makeMenuTree(permissionList, 0L);
        return menuTree;
    }

    /***
     * @description 查询上级菜单列表
     *
     * @return java.util.List<com.zsg.entity.Permission>
     * @date 2023/2/22 12:28
     *
     */
    @Override
    public List<Permission> findParentPermissionList() {
        LambdaQueryWrapper<Permission> queryWrapper = new LambdaQueryWrapper<>();
        // 只查询目录和菜单的数据 0就是目录，1就是菜单， 按钮不查询
        queryWrapper.in(Permission::getType, Arrays.asList(0, 1));
        queryWrapper.orderByAsc(Permission::getOrderNum);
        List<Permission> permissionList = baseMapper.selectList(queryWrapper);
//                构建顶级菜单的数据
        Permission permission = new Permission();
        permission.setId(0L);
        permission.setParentId(-1L);
        permission.setLabel("顶级菜单");
        permissionList.add(permission);
        List<Permission> menuTree = MenuTree.makeMenuTree(permissionList, -1L);
        return menuTree;
    }

    /***
     * @description 判断菜单是否有子菜单
     * @param id
     * @return boolean
     * @date 2023/2/22 14:27
     *
     */
    @Override
    public boolean hasChildrenOfPermission(Long id) {
        final LambdaQueryWrapper<Permission> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Permission::getParentId, id); //TODO 疑问
        if (baseMapper.selectCount(queryWrapper) > 0) {
            return true;
        }
        return false;
    }

    /***
     * @description 查询权限菜单树
     * @param userId
     * @param roleId
     * @return com.zsg.vo.RolePermissionVo
     * @date 2023/2/23 10:42
     *
     */
    @Override
    public RolePermissionVo findPermissionTree(Long userId, Long roleId) {
//         查询当前登录用户的信息
        User user = userMapper.selectById(userId);
//         保存权限菜单
        List<Permission> list = null;
        //         判断当前用户是否是管理元，如果是，则查询所有的权限信息，不是就查询所拥有的权限信息

        if (user != null && !ObjectUtils.isEmpty(user.getIsAdmin()) && user.getIsAdmin() == 1) {
            //                     查询所有权限菜单
            list = baseMapper.selectList(null);
        } else {  // 非管理员  查出所拥有的权限
            list = baseMapper.findPermissionListByUserId(userId);
        }
//        将登录用户所拥有的菜单权限封装成菜单树
        List<Permission> menuTree = MenuTree.makeMenuTree(list, 0L);
        // 查询要分配角色的权限的列表
        List<Permission> rolePermissions = baseMapper.findPermissionListByRoleId(roleId);

//        创建集合保存权限id
        List<Long> listIds = new ArrayList<>();
//         当前用户在给该角色分配权限的时候  进行数据回显
        Optional.ofNullable(list).orElse(new ArrayList<>())
                .stream()
                .filter(Objects::nonNull)
                .forEach(item -> {
                    //当前分配角色的权限的列表
                    Optional.ofNullable(rolePermissions).orElse(new ArrayList<>())
                            .stream()
                            .filter(Objects::nonNull)
                            .forEach(obj -> {
//                                如果两则的权限id一致  则表示拥有该权限
                                if (item.getId().equals(obj.getId())) {
                                    listIds.add(obj.getId());
                                    return;
                                }
                            });
                });
        RolePermissionVo rolePermissionVo = new RolePermissionVo();
        rolePermissionVo.setCheckList(listIds.toArray()); // 当前用户对这个角色所拥有的权限
        rolePermissionVo.setPermissionList(menuTree); // 菜单树
        return rolePermissionVo;
    }


    /**
     * 使用 HashSet 去重
     *
     * @param list
     */
    public static void method_2(List<Integer> list) {
//        HashSet<Integer> set = new HashSet<>(list);
//        System.out.println("去重集合:" + set);
        list.stream().distinct().forEach(e -> {
            System.out.println("e = " + e);
        });
    }
}
